@file:Suppress("MemberVisibilityCanBePrivate", "unused", "UNUSED_PARAMETER",
    "NON_FINAL_MEMBER_IN_FINAL_CLASS"
)

package com.virtualightning.mvvm.base

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.MotionEvent
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import androidx.annotation.CallSuper
import androidx.core.app.ActivityCompat
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.ViewModelStoreOwner
import kotlinx.coroutines.*
import java.io.Serializable
import kotlin.coroutines.CoroutineContext

/**
 *  Anchor : Create by CimZzz
 *  Time : 2021/1/25 15:37:48
 *  Project : zxs-new
 *  Activity 基类
 */
abstract class BaseUI : FragmentActivity(), CoroutineScope by MainScope(), ComponentAware.IComponentSupport {

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/10/9 7:15 PM
    // 抽象组件
    ///////////////////////////////////////////////////////////////////////////
    val aware = ComponentAware(this)

    /**
     * 判断是否为第一次进入到 Resume
     */
    private var isFirstResume = false

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/27 下午6:22
    // 禁止派生类重写该方法，但是可以重写 onRealCreated 来实现同样目的
    ///////////////////////////////////////////////////////////////////////////
    final override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        onRealCreated(savedInstanceState)
        isFirstResume = true
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/10/20 11:00 AM
    // 拦截 onResume 回调，根据条件判断触发 onFirstResume
    ///////////////////////////////////////////////////////////////////////////
    @CallSuper
    override fun onResume() {
        super.onResume()
        if(isFirstResume) {
            isFirstResume = false
            onFirstResume()
        }
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/10/20 11:01 AM
    // 首次 Resume 回调
    ///////////////////////////////////////////////////////////////////////////
    open fun onFirstResume() {

    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/27 下午6:21
    // 实际创建回调
    ///////////////////////////////////////////////////////////////////////////
    abstract fun onRealCreated(savedInstanceState: Bundle?)

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/6/5 9:39 PM
    // 判断是否在触摸区域关闭软键盘
    ///////////////////////////////////////////////////////////////////////////
    protected var closeKeyboardOnTouch = false

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/6/5 9:38 PM
    // 处理触摸关闭键盘事件
    ///////////////////////////////////////////////////////////////////////////
    override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
        if(closeKeyboardOnTouch && ev?.action == MotionEvent.ACTION_DOWN) {
            val view = currentFocus
            if(view is EditText) {
                val l = intArrayOf(0, 0)
                view.getLocationInWindow(l)
                /// 判断触摸区域是否在 EditText 内
                if(ev.x < l[0]
                    || ev.x > l[0] + view.getWidth()
                    || ev.y < l[1]
                    || ev.y > l[1] + view.getHeight()) {
                    val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
                    inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
                    view.clearFocus()
                }
            }
        }
        return super.dispatchTouchEvent(ev)
    }


    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/10/22 5:45 下午
    // 找到参数
    ///////////////////////////////////////////////////////////////////////////
    inline fun <reified T> findArgument(key: String): T? {
        return intent?.extras?.get(key) as? T
    }

    inline fun <reified T> findArgument(key: String, defaultValue: T): T {
        return intent?.extras?.get(key) as? T ?: defaultValue
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/10/8 5:41 PM
    // 只负责打包结果
    ///////////////////////////////////////////////////////////////////////////
    fun configResult(data: Serializable?) {
        val intent = Intent()
        intent.putExtra("data", data)
        setResult(Activity.RESULT_OK, intent)
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/6/8 12:21 AM
    // 打包结果并返回
    ///////////////////////////////////////////////////////////////////////////
    fun returnResult(data: Serializable?) {
        configResult(data)
        finish()
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/6/7 11:47 PM
    // 监控 onActivityResult 回调，如果当前 activityResultMap 存在对应 RequestCode，则将数据喂给对应的
    // ActivityResultDeferred
    ///////////////////////////////////////////////////////////////////////////
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if(aware.onActivityResult(requestCode, resultCode, data)) {
            return
        }
        super.onActivityResult(requestCode, resultCode, data)
    }


    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/10/8 5:43 PM
    // 权限申请回调
    ///////////////////////////////////////////////////////////////////////////
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        if(aware.onRequestPermissionsResult(requestCode, permissions, grantResults)) {
            return
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    }


    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/10/11 2:33 PM
    // 隐藏状态栏
    ///////////////////////////////////////////////////////////////////////////
    fun hideStatusBar() {
        
    }
    
    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/6/8 12:23 AM
    // 监控 onDestroy 回调，做一些销毁工作
    ///////////////////////////////////////////////////////////////////////////
    override fun onDestroy() {
        cancel()
        aware.destroy()
        super.onDestroy()
    }


    ///////////////////////////////////////////////////////////////////////////
    // 代码分割线 on 2021/10/9 7:11 PM by CimZzz
    // 以下内容为:
    // 实现 ComponentAware.IComponentSupport 方法
    ///////////////////////////////////////////////////////////////////////////

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/10/9 7:02 PM
    // 需要提供 startActivityForResult 方法
    ///////////////////////////////////////////////////////////////////////////
    override fun supportStartActivityForResult(intent: Intent, reqCode: Int) {
        startActivityForResult(intent, reqCode)
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/10/9 7:07 PM
    // 需要提供请求权限方法
    ///////////////////////////////////////////////////////////////////////////
    override fun supportRequestPermission(permissions: Array<out String>, reqCode: Int) {
        ActivityCompat.requestPermissions(this, permissions, reqCode)
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/10/9 7:09 PM
    // 需要提供 ViewModel 存储所有者
    ///////////////////////////////////////////////////////////////////////////
    override fun supportViewModelStoreOwner(): ViewModelStoreOwner {
        return this
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/10/9 7:20 PM
    // 需要提供 Activity
    ///////////////////////////////////////////////////////////////////////////
    override fun supportBaseUI(): BaseUI = this

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/10/11 6:03 PM
    // 需要提供协程域
    ///////////////////////////////////////////////////////////////////////////
    override fun supportScope(): CoroutineScope = this
    
}